package co.edu.uniandes.ecos.itera.tsp.interfaz;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.border.TitledBorder;

import co.edu.uniandes.ecos.itera.tsp.mundo.DelegadoNegocio;
import co.edu.uniandes.ecos.itera.tsp.mundo.Defecto;
import co.edu.uniandes.ecos.itera.tsp.mundo.Etapa;

import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogT;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Loc;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogD;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogsD;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Tiempos;

/**
 * Panel para ofrecer funcionalidad del manejo de Defectos
 */
@Tiempos( { @LogT(date="2011-03-20", min=111, taskId=81),
	 @LogT(date = "2011-03-26", min = 6, taskId = 87) })
@LogsD({
	@LogD(etapaInyectada=Etapa.DISENO, idDefecto=4, taskId=81),
	@LogD(etapaInyectada=Etapa.PLANEACION, idDefecto=4, taskId=81)
})
public class ManejarDefectos extends JPanel implements ActionListener
{
	/**
	 * Referencia al objeto que permite trabajar las transacciones de negocio
	 */
	private DelegadoNegocio accesoAMundo;
	
	/**
	 * Defecto que se esta trabajando en estos momentos en esta pantalla
	 */
	private Defecto defectoTrabajandose;
	
	/**
	 * Referencia al objeto contenedor. Este es el objeto
	 * que maneja la pantalla principal, o sea el admon de proyectos
	 */
	private MenuPrincipal referenciaAContenedor;
	
	/**
	 * Determina como unico a este objeto
	 */
	private static final long serialVersionUID = 1L;
	
	/**
	 * Constante para definir la accion de almacenar
	 */
	private static final String ALMACENAR = "Almacenar";
	
	/**
	 * Codigo del defecto
	 */
	private JTextField txtCodigoDefecto;
	
	/**
	 * Nombre del defecto
	 */
	private JTextField txtNombreDefecto;
	
	/**
	 * Boton de Almacenar
	 */
	private JButton btnAlmacenar;
	/**
	 * Consutrctor por defecto
	 * @param mundo Referencia al objeto que permite trabajar las transacciones de negocio
	 */
	public ManejarDefectos(DelegadoNegocio mundo, MenuPrincipal contenedor)
	{
		this.accesoAMundo = mundo;
		this.referenciaAContenedor = contenedor;
		this.defectoTrabajandose = null;
		
		this.pintarse();
	}
	
	/**
	 * Se encarga de pintar los elementos de la pantalla
	 */
	@Loc(size=19, taskId=81)
	private void pintarse()
	{
		setLayout(new GridLayout(4, 1));
		setPreferredSize(new Dimension(400, 200));
		
		TitledBorder border = BorderFactory.createTitledBorder("Manejador de Defectos");
		border.setTitleColor(Color.BLUE);
		setBorder(border);
		
		add(new JLabel("Codigo"));
		
        this.txtCodigoDefecto = new JTextField(30);
		add(this.txtCodigoDefecto);
		
		add(new JLabel("Defecto"));
		
		this.txtNombreDefecto = new JTextField(30);
		add(this.txtNombreDefecto);
		
		this.btnAlmacenar = new JButton( "Guardar" );
		this.btnAlmacenar.setActionCommand( ALMACENAR );
		this.btnAlmacenar.addActionListener( this );
        add( this.btnAlmacenar );
	}
	
	/**
	 * Se encarga de cargar El defecto en pantalla para
	 * poderlo manejar por el usuario
	 * @param defectoACargar Informacion del defecto que se desea actualizar
	 */
	@Loc(size=3, taskId=81)
	public void cargarEntidad(Defecto defectoACargar)
	{
		this.defectoTrabajandose = defectoACargar;
		
		this.txtCodigoDefecto.setText("" + this.defectoTrabajandose.getIdDefecto());
		this.txtNombreDefecto.setText(this.defectoTrabajandose.getDescription());
	}
	
	/**
	 * Almacena el Defecto, ya sea creado o modificado
	 */
	@Loc(size=23, taskId=81)
	public void almacenar()
	{
		if(this.txtCodigoDefecto.getText().trim().length() == 0 ||
		   this.txtNombreDefecto.getText().trim().length() == 0)
		{
			JOptionPane.showMessageDialog(null, "Debe proveer los datos que se le estan preguntando", "Error", JOptionPane.ERROR_MESSAGE);
		}
		else
		{
			if(this.defectoTrabajandose == null) // si se esta creando un defecto
			{
				int idDefecto = Integer.parseInt(this.txtCodigoDefecto.getText().trim());
				String defecto = this.txtNombreDefecto.getText().trim().toUpperCase();
				
				this.defectoTrabajandose = new Defecto(idDefecto, defecto);
				
				this.accesoAMundo.agregarDefecto(defectoTrabajandose);
			}
			else // Si ya existe el defecto
			{
				int idDefecto = Integer.parseInt(this.txtCodigoDefecto.getText().trim());
				String defecto = this.txtNombreDefecto.getText().trim().toUpperCase();
				
				this.defectoTrabajandose.setIdDefecto(idDefecto);
				this.defectoTrabajandose.setDescription(defecto);
			}
			
			JOptionPane.showMessageDialog(null, "Defecto almacenado exitosamente", "Exito", JOptionPane.INFORMATION_MESSAGE);
			
			this.referenciaAContenedor.cargarArbol();
		}
	}

	/**
	 * Acciones a realizar en la pantalla
	 */
	@Override
	@Loc(size=3, taskId=81)
	public void actionPerformed(ActionEvent e) 
	{
		String comando = e.getActionCommand( );

        if( comando.equals(ALMACENAR) )
            this.almacenar();
	}
	
}
